home *** CD-ROM | disk | FTP | other *** search
/ GFX Sensations 1 / Graphic Sensations - Volume 1.iso / tools / amiga / 3d_tools / irit40s.lha / Irit / irit / freeform.irt < prev    next >
Encoding:
Text File  |  1993-12-30  |  18.7 KB  |  669 lines

  1. #
  2. # Some routines to test surface/curve operators
  3. #
  4.  
  5. #
  6. # Set display to on to view some results, off to view nothing.
  7. #
  8. display = on;
  9.  
  10. #
  11. # Control the surface to polygons subdivison resolution, and isolines gen.
  12. #
  13. save_res = resolution;
  14.  
  15. if ( machine == msdos, resolution = 5, resolution = 20 );
  16. drawctlpt = red;
  17.  
  18. s45 = sin( pi / 4 );
  19.  
  20. #  
  21. # Circular constructors
  22. #
  23.  
  24. circ = circle( vector( 0.25, 0.5, 0.5 ), 1.5 );
  25. arc1 = arc( vector( 0.0, 0.0, 0.0 ),
  26.         vector( 0.5, 2.0, 0.0 ),
  27.         vector( 1.0, 0.0, 0.0 ) );
  28. arc2 = arc( vector( 0.0, 0.0, 0.0 ),
  29.         vector( 0.0, 2.0, 0.5 ),
  30.         vector( 0.0, 0.0, 1.0 ) );
  31.  
  32. dumplvl = 9; pdomain( circ ); dumplvl = 1;
  33. if ( display == on, interact( list( axes, circ, arc1, arc2 ) ) );
  34.  
  35. #
  36. # Piecewise linear approximation to a curve using ceval:
  37. #
  38. cb_all = nil();
  39. for ( t = 0.0, 0.2, 4.0,
  40.     cb = ceval( circ, t ):
  41.     snoc( cb, cb_all )
  42.     );
  43. cb_crv = cbspline( 2, cb_all, list( KV_OPEN ) );
  44. color( cb_crv, yellow );
  45. if ( display == on, interact( list( cb_crv, circ, axes ) ) );
  46. free( cb_crv ); free( cb_all ); free( cb );
  47.  
  48. #
  49. # Ruled surface constructor examples.
  50. #
  51. arc3 = arc( vector( 0.0,  0.0, 1.0 ),
  52.         vector( 0.5, -0.2, 1.0 ),
  53.         vector( 1.0,  0.0, 1.0 ) );
  54. ruled = ruledsrf( arc3,
  55.           ctlpt( E2, 0.0, 0.0 ) + ctlpt( E2, 1.0, 0.0 ) );
  56. dumplvl = 9; pdomain( ruled ); dumplvl = 1;
  57. if ( display == on, interact( list( axes, ruled ) ) );
  58. free( ruled );
  59.  
  60. circ = circle( vector( 0.0, 0.0, 0.0 ), 0.25 );
  61. cyl = ruledsrf( circ, circ*trans( vector( 0.0, 0.0, 1.0 ) ) );
  62. if ( display == on, interact( list( axes, cyl ) ) );
  63. free( cyl );
  64.  
  65. skewcyl = ruledsrf( circ, circ*trans( vector( 0.2, 0.0, 1.0 ) ) );
  66. if ( display == on, interact( list( axes, skewcyl ) ) );
  67. free( skewcyl );
  68.  
  69. skew2cyl = ruledsrf( circ*rotx( 20 ),
  70.              circ*rotx( -20 )* trans( vector( 0.0, 0.0, 1.0 ) ) );
  71. if ( display == on, interact( list( axes, skew2cyl ) ) );
  72. free( skew2cyl );
  73.  
  74. drawctlpt = 0;
  75. free( arc1 ); free( arc2 ); free( arc3 ); free( circ );
  76.  
  77. #
  78. # Curve constructors.
  79. #
  80. crv1 = ctlpt( E3, 0.5, 0.0, 1.0 ) +
  81.        ctlpt( E3, 0.5, 0.0, 1.2 ) +
  82.        ctlpt( E3, 1.0, 0.0, 1.2 );
  83. crv2 = crv1 +
  84.        arc( vector( 1.0,  0.0, 0.75 ),
  85.         vector( 0.75, 0.0, 0.7 ),
  86.         vector( 0.5,  0.0, 0.85 ) ) +
  87.        arc( vector( 0.5,  0.0, 0.75 ),
  88.         vector( 0.75, 0.0, 0.8 ),
  89.         vector( 1.0,  0.0, 0.65 ) );
  90. crv3 = crv2 +
  91.        crv2 * trans( vector( -0.5, 0.15, -0.5 ) ) +
  92.        crv2 * trans( vector( -1.0, 0.3,  -1.0 ) );
  93.  
  94. if ( display == on, interact( list( axes, crv3 ) ):
  95.             viewstate("FinrAprx"):
  96.             pause(1):
  97.             viewstate("CrsrAprx") );
  98.  
  99. free( crv1 ); free( crv2 ); free( crv3 );
  100.  
  101. cross = arc( vector( 0.2, 0.0, 0.0 ),
  102.          vector( 0.2, 0.2, 0.0 ),
  103.          vector( 0.0, 0.2, 0.0 ) ) +
  104.     arc( vector( 0.0, 0.4, 0.0 ),
  105.          vector( 0.1, 0.4, 0.0 ),
  106.          vector( 0.1, 0.5, 0.0 ) ) +
  107.     arc( vector( 0.8, 0.5, 0.0 ),
  108.          vector( 0.8, 0.3, 0.0 ),
  109.          vector( 1.0, 0.3, 0.0 ) ) +
  110.     arc( vector( 1.0, 0.1, 0.0 ),
  111.          vector( 0.9, 0.1, 0.0 ),
  112.          vector( 0.9, 0.0, 0.0 ) ) +
  113.     ctlpt( E2, 0.2, 0.0 );
  114. if ( display == on, interact( list( axes, cross ) ) );
  115.  
  116. #
  117. # Curves and surfaces convertions and compatibility.
  118. #
  119. crv1 = cbezier( list( ctlpt( E2, -1, 0 ),
  120.               ctlpt( E2,  0, 2 ),
  121.               ctlpt( E2,  1, 0 ) ) );
  122. crv2 = cbspline( 4,
  123.          list( ctlpt( P3,  1.0,  0.0, 0.1,  1.0 ),
  124.                ctlpt( P3,  s45, -s45, 1.0,  s45 ),
  125.                ctlpt( P3,  1.0,  1.0, 0.1,  0.0 ),
  126.                ctlpt( P3,  s45, -s45, 1.0, -s45 ),
  127.                ctlpt( P3,  1.0,  0.0, 0.1, -1.0 ) ),
  128.          list( KV_OPEN ) );
  129. color( crv1, yellow );
  130. color( crv2, yellow );
  131.  
  132. crv1bsp = bzr2bsp( crv1 );
  133. color( crv1bsp, green );
  134. crv2bzr = bsp2bzr( crv2 );
  135. color( crv2bzr, green );
  136. if ( display == on, interact( list( crv1bsp, crv1, crv2bzr, crv2 ) ) );
  137. free( crv1bsp );
  138. free( crv2bzr );
  139.  
  140. if ( display == on, interact( list( crv1, crv2 ) ) );
  141. ffcompat( crv1, crv2 );
  142. if ( display == on, interact( list( crv1, crv2 ) ) );
  143.  
  144. srf1 = sbezier( list( list( ctlpt( E2, 0.0, 0.0 ),
  145.                     ctlpt( E2, 0.0, 1.0 ),
  146.                     ctlpt( E2, 0.0, 2.0 ) ),
  147.                   list( ctlpt( E2, 1.0, 0.0 ),
  148.                     ctlpt( E2, 1.0, 1.0 ),
  149.                     ctlpt( E2, 1.0, 2.0 ) ) ) );
  150. srf2 = sbspline( 2, 4,
  151.          list( list( ctlpt( E3, 0.0, 0.0, 1.0 ),
  152.                      ctlpt( E3, 0.0, 1.0, 0.0 ),
  153.                      ctlpt( E3, 0.0, 2.0, 1.0 ) ),
  154.                    list( ctlpt( E3, 1.0, 0.0, 0.0 ),
  155.                      ctlpt( E3, 1.0, 1.0, 2.0 ),
  156.                      ctlpt( E3, 1.0, 2.0, 0.0 ) ),
  157.                    list( ctlpt( E3, 2.0, 0.0, 2.0 ),
  158.                      ctlpt( E3, 2.0, 1.0, 0.0 ),
  159.                      ctlpt( E3, 2.0, 2.0, 2.0 ) ),
  160.                    list( ctlpt( E3, 3.0, 0.0, 0.0 ),
  161.                      ctlpt( E3, 3.0, 1.0, 2.0 ),
  162.                      ctlpt( E3, 3.0, 2.0, 0.0 ) ),
  163.                    list( ctlpt( E3, 4.0, 0.0, 1.0 ),
  164.                      ctlpt( E3, 4.0, 1.0, 0.0 ),
  165.                      ctlpt( E3, 4.0, 2.0, 1.0 ) ) ),
  166.          list( list( KV_OPEN ),
  167.                list( KV_OPEN ) ) );
  168. color( srf1, yellow );
  169. color( srf2, yellow );
  170.  
  171. srf1bsp = bzr2bsp( srf1 );
  172. color( srf1bsp, green );
  173. srf2bzr = bsp2bzr( srf2 );
  174. color( srf2bzr, green );
  175. if ( display == on, interact( list( srf1bsp, srf1, srf2bzr, srf2 ) ) );
  176. free( srf1bsp );
  177. free( srf2bzr );
  178.  
  179. if ( display == on, interact( list( srf1, srf2 ) ) );
  180. ffcompat( srf1, srf2 );
  181. if ( display == on, interact( list( srf1, srf2 ) ) );
  182.  
  183. #
  184. # Create floating end condition examples (although barely used!).
  185. #
  186. drawctlpt = red;
  187. crv1f = cbspline( 4, 
  188.           list( ctlpt( E2, 0.0, 0.0 ),
  189.              ctlpt( E2, 1.0, 1.0 ),
  190.                 ctlpt( E2, 0.0, 2.0 ),
  191.                     ctlpt( E2, 1.0, 0.0 ) ),
  192.           list( KV_FLOAT ) );
  193. color( crv1f, yellow );
  194. if ( display == on, view( crv1f, on ):
  195.             viewstate("DSrfMesh"):
  196.             pause( 1 ):
  197.             viewstate("DSrfMesh"):
  198.             pause( 1 ) );
  199.  
  200. srf1f = sbspline( 2, 4,
  201.           list( list( ctlpt( E3, 0.0, 0.0, 1.0 ),
  202.                       ctlpt( E3, 0.0, 1.0, 0.0 ),
  203.                       ctlpt( E3, 0.0, 2.0, 1.0 ) ),
  204.                     list( ctlpt( E3, 1.0, 0.0, 0.0 ),
  205.                       ctlpt( E3, 1.0, 1.0, 2.0 ),
  206.                       ctlpt( E3, 1.0, 2.0, 0.0 ) ),
  207.                     list( ctlpt( E3, 2.0, 0.0, 2.0 ),
  208.                       ctlpt( E3, 2.0, 1.0, 0.0 ),
  209.                       ctlpt( E3, 2.0, 2.0, 2.0 ) ),
  210.                     list( ctlpt( E3, 3.0, 0.0, 0.0 ),
  211.                       ctlpt( E3, 3.0, 1.0, 2.0 ),
  212.                       ctlpt( E3, 3.0, 2.0, 0.0 ) ),
  213.                     list( ctlpt( E3, 4.0, 0.0, 1.0 ),
  214.                       ctlpt( E3, 4.0, 1.0, 0.0 ),
  215.                       ctlpt( E3, 4.0, 2.0, 1.0 ) ) ),
  216.           list( list( KV_FLOAT ),
  217.                 list( KV_FLOAT ) ) );
  218. color( srf1f, yellow );
  219. if ( display == on, view( srf1f, on ):
  220.             viewstate("DSrfMesh"):
  221.             pause( 1 ):
  222.             viewstate("DSrfMesh"):
  223.             pause( 1 ) );
  224.  
  225. free(crv1f);
  226. free(srf1f);
  227.  
  228. #
  229. # Direct control points manipulation.
  230. #
  231. cb = cbezier( list( ctlpt( E3, -1, 0, 0 ),
  232.             ctlpt( E3,  0, 0, 0 ),
  233.             ctlpt( E3,  1, 0, 0 ) ) );
  234.  
  235. cb_all = list( axes );
  236. for ( z = -0.9, 0.3, 0.9,
  237.     cb1 = ceditpt( cb, ctlpt( E3, 0, 0, z ), 1 ):
  238.     color( cb1, green ):
  239.     snoc( cb1, cb_all )
  240.     );
  241. if ( display == on, interact( cb_all ) );
  242. free( cb_all ); free( cb ); free( cb1 );
  243.  
  244.  
  245. sb = ruledSrf( cbezier( list( ctlpt( E3, -0.5, -0.5, 0.0 ),
  246.                   ctlpt( E3,  0.5, -0.5, 0.0 ) ) ),
  247.            cbezier( list( ctlpt( E3, -0.5,  0.5, 0.0 ),
  248.                   ctlpt( E3,  0.5,  0.5, 0.0 ) ) ) );
  249. sb = sraise( sraise( sb, row, 3 ),
  250.          col, 3 );
  251. sb = srefine( srefine( sb, row, false, list( 0.333, 0.667 ) ),
  252.           col, false, list( 0.333, 0.667 ) );
  253. sb_all = list( axes );
  254. for ( z = -0.9, 0.6, 0.9,
  255.     sb1 = seditpt( sb, ctlpt( E3, 0, 0, z ), 2, 2 ):
  256.     color( sb1, green ):
  257.     snoc( sb1, sb_all )
  258.     );
  259. if ( display == on, interact( sb_all ) );
  260. free( sb_all ); free( sb ); free( sb1 );
  261.  
  262. #
  263. # Curve order raise:
  264. #
  265. cb = cbezier( list( ctlpt( E2, -1, 0 ),
  266.             ctlpt( E2,  0, 2 ),
  267.             ctlpt( E2,  1, 0 ) ) );
  268.  
  269. cb_all = list( axes, cb );
  270. for ( o = 4, 1, 8,
  271.     cb1 = craise( cb, o ):
  272.     color( cb1, green ):
  273.     snoc( cb1, cb_all )
  274.     );
  275. if ( display == on, view( cb_all, on ):
  276.             viewstate("DSrfMesh"):
  277.             pause( 1 ):
  278.             viewstate("DSrfMesh"):
  279.             pause( 1 ) );
  280. free( cb_all ); free( cb ); free( cb1 );
  281.  
  282. drawctlpt = 0;
  283.  
  284. #
  285. # Extrusion examples.
  286. #
  287. cbzr = cbezier( list( ctlpt( E2, 0.0, 0.0 ),
  288.               ctlpt( E2, 1.0, 0.0 ),
  289.               ctlpt( E2, 1.0, 1.0 ) ) );
  290. color( cbzr, white );
  291.  
  292. s = extrude( cbzr, vector( 0.0, 0.0, 1.0 ) );
  293.  
  294. if ( display == on, interact( list( axes, s, cbzr ) ) );
  295. free( cbzr ); free( s );
  296.  
  297. s = extrude( cross, vector( 0.0, 0.0, 1.0 ) );
  298. if ( display == on, interact( list( axes, s ) ) );
  299.  
  300. s = extrude( cross, vector( 0.1, 0.2, 1.0 ) );
  301. if ( display == on, interact( list( axes, s ) ) );
  302.  
  303. resolution = 10;
  304. ps = gpolygon( s );
  305. if ( display == on, interact( list( axes, ps ) ) );
  306. free( ps );
  307. free( s );
  308.  
  309. if ( machine == msdos, resolution = 5, resolution = 20 );
  310.  
  311. #
  312. # Srf of revolution examples
  313. #
  314.  
  315. cbzr = cbezier( list( ctlpt( E3, 0.0, 0.0, 0.0 ),
  316.               ctlpt( E3, 1.0, 0.0, 0.0 ),
  317.               ctlpt( E3, 1.0, 0.0, 1.0 ) ) );
  318. color( cbzr, white );
  319.  
  320. sb = surfrev( cbzr );
  321.  
  322. if ( display == on, interact( list( sb, cbzr ) ) );
  323.  
  324. halfcirc = cbspline( 3,
  325.              list( ctlpt( P3, 1.0,  0.0, 0.0,  1.0 ),
  326.                    ctlpt( P3, s45, -s45, 0.0,  s45 ),
  327.                    ctlpt( P3, 1.0, -1.0, 0.0,  0.0 ),
  328.                    ctlpt( P3, s45, -s45, 0.0, -s45 ),
  329.                ctlpt( P3, 1.0,  0.0, 0.0, -1.0 ) ),
  330.              list( 0, 0, 0, 1, 1, 2, 2, 2 ) );
  331. color( halfcirc, white );
  332.  
  333. sp = surfrev( halfcirc );
  334.  
  335. if ( display == on, interact( list( sp, halfcirc ) ) );
  336.  
  337. gcross = cbspline( 3,
  338.            list( ctlpt( E3, 0.3, 0.0, 0.0 ),
  339.                  ctlpt( E3, 0.3, 0.0, 0.05 ),
  340.                  ctlpt( E3, 0.1, 0.0, 0.05 ),
  341.                  ctlpt( E3, 0.1, 0.0, 0.4 ),
  342.                  ctlpt( E3, 0.5, 0.0, 0.4 ),
  343.                  ctlpt( E3, 0.6, 0.0, 0.8 ) ),
  344.            list( 0, 0, 0, 1, 2, 3, 4, 4, 4 ) );
  345. color( gcross, white );
  346. glass = surfrev( gcross );
  347. if ( display == on, interact( list( axes, glass, gcross ) ) );
  348.  
  349. #
  350. # Sweep examples.
  351. #
  352. ccross = cross * trans( vector( -0.5, -0.25, 0.0 ) );
  353.  
  354. sweep_axis = crefine( cbspline( 3,
  355.                     list( ctlpt( E3,  0.0,  1.0, 1.0 ),
  356.                       ctlpt( E3,  1.0,  1.0, 1.0 ),
  357.                       ctlpt( E3,  1.0, -1.0, 0.0 ),
  358.                       ctlpt( E3, -1.0, -1.0, 0.0 ),
  359.                       ctlpt( E3, -1.0,  1.0, 1.0 ),
  360.                       ctlpt( E3,  0.0,  1.0, 1.0 ) ),
  361.                     list( KV_OPEN ) ),
  362.               false,
  363.               list( 0.5, 1.5, 2.5, 3.5 ) );
  364.  
  365. arc1 = arc( vector( 1.0, 0.0, 0.0 ),
  366.         vector( 0.0, 0.0, 0.0 ),
  367.         vector( 0.0, 1.0, 0.0 ) );
  368. s = sweepsrf( ccross, arc1, 0.2, off );
  369. if ( display == on, interact( list( axes, s ) ) );
  370.  
  371. arc1 = arc( vector( -1.0, 0.0, 0.0 ),
  372.         vector( 0.0, 0.0, 0.1 ),
  373.         vector( 1.0, 0.0, 0.0 ) );
  374. arc1 = crefine( arc1, false, list( 0.25, 0.5, 0.75 ) );
  375. scalecrv = cbezier( list( ctlpt( E2, 0.0, 0.1 ),
  376.                          ctlpt( E2, 1.0, 0.5 ),
  377.                          ctlpt( E2, 2.0, 0.1 ) ) );
  378. s = sweepsrf( ccross, arc1, scalecrv, off );
  379. if ( display == on, interact( list( axes, s ) ) );
  380.  
  381. circ = circle( vector( 0.0, 0.0, 0.0 ), 1.0 );
  382.  
  383. s = sweepsrf( circ, circ, 0.25, off );
  384. if ( display == on, interact( list( axes, s ) ) );
  385.  
  386. resolution = 10;
  387. ps = gpolygon( s );
  388. if ( display == on, interact( list( axes, ps ) ) );
  389. free( ps );
  390.  
  391. if ( machine == msdos, resolution = 5, resolution = 20 );
  392.  
  393. s = sweepsrf( circ, circ, scalecrv, off );
  394. if ( display == on, interact( list( axes, s ) ) );
  395.  
  396. s = sweepsrf( ccross, sweep_axis, 0.2, off );
  397. if ( display == on, interact( list( axes, s ) ) );
  398.  
  399. s = sweepsrf( ccross, sweep_axis, 0.2, vector( 0.0, 0.0, 1.0 ) );
  400. if ( display == on, interact( list( axes, s ) ) );
  401.  
  402. s = sweepsrf( ccross, circle( vector( 0.0, 0.0, 0.0 ), 1.0 ), 0.2,
  403.           circle( vector( 0.0, 0.0, 1.0 ), -1.0 ) );
  404. if ( display == on, interact( list( axes, s ) ) );
  405.  
  406. free( ccross );
  407. free( cross );
  408. free( circ );
  409. free( arc1 );
  410.  
  411. #
  412. # Boolean sum examples.
  413. #
  414. cbzr1 = cbezier( list( ctlpt( E3, -0.2,  0.1,  0.5 ),
  415.                ctlpt( E3,  0.0,  0.5,  1.0 ),
  416.                ctlpt( E3,  0.1,  1.0, -0.2 ) ) );
  417. cbzr2 = cbezier( list( ctlpt( E3,  1.0,  0.0, -0.3 ),
  418.                ctlpt( E3,  0.8,  0.5, -1.0 ),
  419.                ctlpt( E3,  1.0,  1.0,  0.2 ) ) );
  420. cbzr3 = cbezier( list( ctlpt( E3, -0.2,  0.1,  0.5 ),
  421.                ctlpt( E3,  0.5,  0.0, -1.0 ),
  422.                ctlpt( E3,  1.0,  0.0, -0.3 ) ) );
  423. cbzr4 = cbezier( list( ctlpt( E3,  0.1,  1.0, -0.2 ),
  424.                ctlpt( E3,  0.5,  1.0,  1.0 ),
  425.                ctlpt( E3,  1.0,  1.0,  0.2 ) ) );
  426.  
  427. s = boolsum( cbzr1, cbzr2, cbzr3, cbzr4 );
  428. color(s, green);
  429. if ( display == on, interact( list( axes, s, cbzr1, cbzr2, cbzr3, cbzr4 ) ) );
  430.  
  431. cbzr1 = cbezier( list( ctlpt( E3, -0.1,  0.1,  0.2 ),
  432.                ctlpt( E3,  0.0,  0.5,  1.0 ),
  433.                ctlpt( E3,  0.1,  1.0,  0.2 ) ) );
  434. cbzr2 = cbezier( list( ctlpt( E3,  1.0,  0.2, -0.1 ),
  435.                ctlpt( E3,  1.0,  0.5, -1.0 ),
  436.                ctlpt( E3,  1.1,  1.1,  0.1 ) ) );
  437. cbzr3 = cbezier( list( ctlpt( E3, -0.1,  0.1,  0.2 ),
  438.                ctlpt( E3,  0.2,  0.1, -1.0 ),
  439.                ctlpt( E3,  0.4,  0.0,  2.0 ),
  440.                ctlpt( E3,  0.5, -0.1, -1.0 ),
  441.                ctlpt( E3,  1.0,  0.2, -0.1 ) ) );
  442. cbzr4 = cbezier( list( ctlpt( E3,  0.1,  1.0,  0.2 ),
  443.                ctlpt( E3,  0.5,  0.8,  1.0 ),
  444.                ctlpt( E3,  0.7,  0.9, -2.0 ),
  445.                ctlpt( E3,  0.8,  1.0,  1.0 ),
  446.                ctlpt( E3,  1.1,  1.1,  0.1 ) ) );
  447. s = boolsum( cbzr1, cbzr2, cbzr3, cbzr4 );
  448. color(s, green);
  449. if ( display == on, interact( list( axes, s, cbzr1, cbzr2, cbzr3, cbzr4 ) ) );
  450.  
  451. cbzr1 = cbezier( list( ctlpt( E3, 0.1, 0.1, 0.1 ),
  452.                ctlpt( E3, 0.0, 0.5, 1.0 ),
  453.                ctlpt( E3, 0.4, 1.0, 0.4 ) ) );
  454. cbzr2 = cbezier( list( ctlpt( E3, 1.0, 0.2, 0.2 ),
  455.                ctlpt( E3, 1.0, 0.5, -1.0 ),
  456.                ctlpt( E3, 1.0, 1.0, 0.3 ) ) );
  457. cbsp3 = cbspline( 4,
  458.           list( ctlpt( E3, 0.1,  0.1, 0.1 ),
  459.                 ctlpt( E3, 0.25, 0.0, -1.0 ),
  460.                 ctlpt( E3, 0.5,  0.0, 2.0 ),
  461.                 ctlpt( E3, 0.75, 0.0, -1.0 ),
  462.                 ctlpt( E3, 1.0,  0.2, 0.2 ) ),
  463.           list( KV_OPEN ) );
  464. cbsp4 = cbspline( 4,
  465.           list( ctlpt( E3, 0.4,  1.0, 0.4 ),
  466.                 ctlpt( E3, 0.25, 1.0, 1.0 ),
  467.                 ctlpt( E3, 0.5,  1.0, -2.0 ),
  468.                 ctlpt( E3, 0.75, 1.0, 1.0 ),
  469.                 ctlpt( E3, 1.0,  1.0, 0.3 ) ),
  470.           list( KV_OPEN ) );
  471.  
  472. s = boolsum( cbzr1, cbzr2, cbsp3, cbsp4 );
  473. color(s, green);
  474. if ( display == on, interact( list( axes, s, cbzr1, cbzr2, cbsp3, cbsp4 ) ) );
  475.  
  476. free( cbzr1 ); free( cbzr2 ); free( cbzr3 ); free( cbzr4 );
  477. free( cbsp3 ); free( cbsp4 );
  478.  
  479. #
  480. # Boolean one examples.
  481. #
  482. s = boolone( circle( vector( 0.0, 0.0, 0.0 ), 1.0 ) );
  483. color(s, green);
  484. if ( display == on, interact( list( axes, s ) ) );
  485.  
  486. c1 = ctlpt( E3, 0, 0, 0.5 ) +
  487.      ctlpt( E3, 1, 0, 0 ) +
  488.      ctlpt( E3, 1, 1, 0.5 ) +
  489.      ctlpt( E3, 0, 1, 0 ) +
  490.      ctlpt( E3, 0, 0, 0.5 );
  491. s = boolone( c1 );
  492. color(s, green);
  493. if ( display == on, interact( list( axes, s, c1 ) ) );
  494.  
  495. #
  496. # Surface from curves constructor.
  497. #
  498. c1 = cbspline( 3,
  499.            list( ctlpt( E3, 0.0, 0.0, 0.0 ),
  500.              ctlpt( E3, 1.0, 0.0, 0.0 ),
  501.              ctlpt( E3, 1.0, 1.0, 0.0 ) ),
  502.            list( KV_OPEN ) );
  503. c2 = cbspline( 3,
  504.            list( ctlpt( E3, 0.0, 0.0, 1.0 ),
  505.              ctlpt( E3, 1.0, 0.0, 1.0 ),
  506.              ctlpt( E3, 1.0, 2.0, 1.0 ) ),
  507.            list( KV_OPEN ) );
  508. c3 = cbspline( 3,
  509.            list( ctlpt( E3, 0.0, 0.0, 1.5 ),
  510.              ctlpt( E3, 2.0, 0.0, 1.5 ),
  511.              ctlpt( E3, 1.0, 0.5, 1.5 ),
  512.              ctlpt( E3, 1.0, 1.0, 1.5 ) ),
  513.            list( KV_OPEN ) );
  514. c4 = cbspline( 3,
  515.            list( ctlpt( E3, 0.0, 0.0, 2.5 ),
  516.              ctlpt( E3, 1.0, 0.0, 2.5 ),
  517.              ctlpt( E3, 1.0, 1.0, 2.5 ) ),
  518.            list( KV_OPEN ) );
  519.  
  520. s = sfromcrvs( list( c1, c2, c3, c4 ), 2 );
  521. color( s, green );
  522. if ( display == on, interact( list( s, c1, c2, c3, c4 ) ) );
  523. s = sfromcrvs( list( c1, c2, c3, c4 ), 4 );
  524. color( s, green );
  525. if ( display == on, interact( list( s, c1, c2, c3, c4 ) ) );
  526. free( c1 ); free( c2 ); free( c3 ); free( c4 );
  527.  
  528. #
  529. # Offset and adaptive, with global tolerance, aoffset.
  530. #
  531. cpawn = cbspline( 4,
  532.     list( ctlpt( E2, 0.95, 0.05 ),
  533.           ctlpt( E2, 0.95, 0.76 ),
  534.           ctlpt( E2, 0.30, 1.52 ),
  535.           ctlpt( E2, 0.30, 1.90 ),
  536.           ctlpt( E2, 0.50, 2.09 ),
  537.           ctlpt( E2, 0.72, 2.24 ),
  538.           ctlpt( E2, 0.72, 2.32 ),
  539.           ctlpt( E2, 0.38, 2.50 ),
  540.           ctlpt( E2, 0.42, 2.70 ),
  541.           ctlpt( E2, 0.57, 2.81 ),
  542.           ctlpt( E2, 0.57, 3.42 ),
  543.           ctlpt( E2, 0.19, 3.57 ),
  544.           ctlpt( E2, 0.00, 3.57 ) ),
  545.      list( KV_OPEN ) );
  546. c1 = offset(cpawn, 0.5);
  547. color(c1, magenta);
  548. c2 = aoffset(cpawn, 0.5, 0.05, false);
  549. color(c2, green);
  550. c3 = aoffset(cpawn, 0.5, 0.05, true);
  551. color(c3, yellow);
  552. if ( display == on, interact( list( c1, c2, c3, cpawn ) ) );
  553. free(c1);
  554. free(c2);
  555. free(c3);
  556.  
  557. #
  558. # Zero set of curves and inflection points
  559. #
  560. cbsp = list( ctlpt( E2, 1.0, 1.0 ),
  561.          ctlpt( E2,-1.0, 1.0 ),
  562.          ctlpt( E2,-1.0,-1.0 ),
  563.          ctlpt( E2, 1.5, 1.0 ),
  564.          ctlpt( E2,-1.0,-1.4 ),
  565.          ctlpt( E2, 1.0, 0.1 ) );
  566. cb = cbspline( 4, cbsp, list( KV_OPEN ) );
  567.  
  568. xzeros = czeros( cb, 0.001, 1 );
  569. pt_xzeros = nil();
  570. pt = nil();
  571. for ( i = 1, 1, listsize( xzeros ),
  572.     pt = ceval( cb, nth( xzeros, i ) ):
  573.     snoc( pt, pt_xzeros )
  574.     );
  575. if ( display == on, interact( list( axes, cb, pt_xzeros ) ) );
  576. free(xzeros);
  577. free(pt_xzeros);
  578.  
  579. yzeros = czeros( cb, 0.001, 2 );
  580. pt_yzeros = nil();
  581. pt = nil();
  582. for ( i = 1, 1, listsize( yzeros ),
  583.     pt = ceval( cb, nth( yzeros, i ) ):
  584.     snoc( pt, pt_yzeros )
  585.     );
  586. if ( display == on, interact( list( axes, cb, pt_yzeros ) ) );
  587. free(yzeros);
  588. free(pt_yzeros);
  589.  
  590. xextremes = cextremes( cb, 0.001, 1 );
  591. pt_xextremes = nil();
  592. pt = nil();
  593. for ( i = 1, 1, listsize( xextremes ),
  594.     pt = ceval( cb, nth( xextremes, i ) ):
  595.     snoc( pt, pt_xextremes )
  596.     );
  597. if ( display == on, interact( list( axes, cb, pt_xextremes ) ) );
  598. free(xextremes);
  599. free(pt_xextremes);
  600.  
  601. yextremes = cextremes( cb, 0.001, 2 );
  602. pt_yextremes = nil();
  603. pt = nil();
  604. for ( i = 1, 1, listsize( yextremes ),
  605.     pt = ceval( cb, nth( yextremes, i ) ):
  606.     snoc( pt, pt_yextremes )
  607.     );
  608. if ( display == on, interact( list( axes, cb, pt_yextremes ) ) );
  609. free(yextremes);
  610. free(pt_yextremes);
  611.  
  612. inflect = cinflect( cb, 0.001 );
  613. pt_inflect = nil();
  614. pt = nil();
  615. for ( i = 1, 1, listsize( inflect ),
  616.     pt = ceval( cb, nth( inflect, i ) ):
  617.     snoc( pt, pt_inflect )
  618.     );
  619. if ( display == on, interact( list( axes, cb, pt_inflect ) ) );
  620. free(inflect);
  621. free(pt_inflect);
  622.  
  623. #
  624. # Computation of extremum of curvature for curves
  625. #
  626. crv = cbezier( list( ctlpt( E3, -0.5,  0.5,  0.5 ),
  627.              ctlpt( E3, -0.5, -0.6,  0.5 ),
  628.              ctlpt( E3,  0.0,  1.0, -1.0 ),
  629.              ctlpt( E3,  0.5, -0.5,  0.5 ) ) );
  630.  
  631. crvtr = ccrvtr( crv, 0.001 );
  632. pt_crvtr = nil();
  633. pt = nil();
  634. for ( ( i = 1 ), 1, listsize( crvtr ),
  635.     (
  636.       ( pt = ceval( crv, nth( crvtr, i ) ) ):
  637.       snoc( pt, pt_crvtr )
  638.     )
  639.     );
  640. if ( display == on, interact( list( crv, pt_crvtr ) ) );
  641.  
  642. crv = cbspline( 4,
  643.         list( ctlpt( E2, -1.0,  0.5 ),
  644.               ctlpt( E2,  0.0,  0.5 ),
  645.               ctlpt( E2,  0.0,  0.0 ),
  646.               ctlpt( E2, -1.0, -1.0 ),
  647.               ctlpt( E2,  1.0, -1.0 ),
  648.               ctlpt( E2,  1.0, -0.7 ),
  649.               ctlpt( E2,  0.0,  1.0 ),
  650.               ctlpt( E2,  1.0,  1.0 ) ),
  651.         list( KV_OPEN ) );
  652.  
  653. crvtr = ccrvtr( crv, 0.001 );
  654. pt_crvtr = nil();
  655. pt = nil();
  656. for ( ( i = 1 ), 1, listsize( crvtr ),
  657.     (
  658.       ( pt = ceval( crv, nth( crvtr, i ) ) ):
  659.       snoc( pt, pt_crvtr )
  660.     )
  661.     );
  662. if ( display == on, interact( list( crv, pt_crvtr ) ) );
  663.  
  664. display = off;
  665.  
  666. resolution = save_res;
  667. drawctlpt = 0;
  668.  
  669.